function serialize(data) {
    let result = "";
    for (const key in data) {
        result += `${key}=${data[key]}&`
    }
    return result.slice(0, -1);
}

function ajax(options = {}) {
    return new Promise((resolve, reject) => {
        const {
            url,
            method,
            data = {},
            isJson,
            headers = {}
        } = options;

        const xhr = new XMLHttpRequest();
        xhr.responseType = "json";

        // 判断该次请求是否为 GET 请求，如果是，则需要将参数拼接到 url 上
        if (method.toLowerCase() === 'get') {
            xhr.open('GET', `${url}?${serialize(data)}`)
            // 添加请求头
            for (const key in headers) {
                xhr.setRequestHeader(key, headers[key])
            }
            xhr.send();
        } else {
            // 由于请求方式还存在 PUT、DELETE，这些方式的数据同样要携带到请求体上
            xhr.open(method, url);

            // 判断请求体是否需要以 JSON 格式发送
            if (isJson) {
                xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
                xhr.send(JSON.stringify(data))
            } else {
                xhr.setRequestHeader("Content-Type", "application/x-www-urlencoded;charset=utf-8");
                xhr.send(serialize(data));
            }
        }

        xhr.addEventListener("load", function () {
            if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) {
                resolve(xhr.response)
            } else {
                reject(xhr.response)
            }
        })
    })
}